/**
*
*
*\author Isabel Martín Herrero 48539974 S
*
*
**/

#include <iostream>
#include "Figura2D.h"
#include "ExcepcionSVG.h"
#include <vector>
#include <sstream>

/**
*\file Rectangulo.h
*\brief Archivo .h de la clase Rectangulo
*Archivo que contiene la declaración la clase Rectangulo
**/

using namespace std;

#ifndef _PIJIRITO_H_
#define _PIJIRITO_H_


/** \brief Clase Poligono
 *
 * La clase Rectangulo permite crear, destruir y modificar objetos de tipo Rectangulo.Un objeto Rectangulo sólamente tiene los atributos privados base, altura y origen
 * La clase Rectangulo es amiga de ostream, e hija de Figura2D
 */

class Poligono: public Figura2D 
{
	/** \brief Sobrecarga del operador de salida de la clase Rectangulo
	*
	* Función amiga. Emite por flujo de salida la representación en SVG de un rectángulo
	* \param os Objeto de tipo ostream 
	* \param p Objeto rectángulo 
	* \return Devuelve ostream &
	*/
	friend ostream& operator<<(ostream& os, const Poligono& p);

	private:	
		
		/** \brief Miembro vertices
		*
		* perimetro, de tipo Coordenada, contiene todas las coordenadas del poligono.
		*/	
		vector<Coordenada> vertices;
		
		
		/** \brief Miembro numVertices
		*
		* Almacena el numero de vertices que tiene un poligono
		*/
		int numVertices;
	public:
	
		/** \brief Constructor de la clase Poligono
		*
		* Crea un objeto de tipo Poligono. Los valores por defecto son origen =0.0, base = 0.0, altura = 0.0 grosor=1 color=negro y color de linea=ninguno;
		*/
		Poligono(vector<Coordenada> =vector<Coordenada>(), int =0, int = 1, Color = black, Color = none);
		
		/** \brief Constructor de copia de la clase Poligono
		*
		* Crea un objeto de tipo Poligono a partir de otro que se le pasa por parámetro
		*
		*/
		Poligono(const Poligono&);
		
		/** \brief Destructor de la clase Poligono
		*
		* Libera toda la memoria ocupada por un objeto de tipo Poligono
		* 
		*/
		~Poligono();
		
		/** \brief Sobrecarga del operador de asignación de la clase Poligono
		*
		* Copia en el objeto que invoca al método los valores del que se le pasa como parámetro
		* \param p Objeto de tipo rectángulo 
		* \return Devuelve un objeto de tipo rectangulo (el invocador modificado)
		*/
		Poligono& operator=(const Poligono& p);
		
		/** \brief Método getPerimetro de la clase Poligono
		*
		* Método que devuelve el dato miembro base
		* \return Devuelve uin vector con las coordenadas del poligono;
		*/
		vector<Coordenada> getPerimetro()const;
		
		/** \brief Método getNumVertices de la clase Poligono
		* Método que devuelve el vector de coordenadas
		* \return Devuelve el numero de vertices del poligono
		*/
		int getNumVertices() const {return (int)vertices.size();};
		
		/** \brief Método getVertice de la clase Poligono
		* \param vertice Objeto de tipo rectángulo 
		* Método que retorna el vertice pasado por parametro
		* \return Devuelve el vertice del poligono
		*/
		Coordenada getVertice(int vertice) const {return vertices[vertice-1];};
		
		/** \brief Método setVertice de la clase Poligono
		*
		* Método que cambia el valor de un vertice;
		* \return Devuelve void
		*/
		void setVertice(int , const Coordenada& );
		
		/** \brief Método pintar de la clase 
		*
		* Emite por flujo de salida la representación en SVG de un poligono
		* \param os Objeto de tipo ostream 
		* \return Devuelve void
		*/
		void pintar(ostream& os) const;
		
		/** \brief Método leeEntrada.
		*
		* Lee la procesa la entrada proporcionada;
		*/		
		void leeEntrada(istream& );
		
		/** \brief Método clonar.
		*
		* Crea un nuevo poligono
		*/
		Poligono* clonar() const;
		
		/** \brief Método duplicar.
		*
		* Crea un nuevo poligono
		*/
		Poligono* duplicar(const Coordenada& );

		
		/** \brief Método escalar.
		*
		* Escala la figura
		*/
		void escalar(float=100.0);
};

#endif
